﻿<?php
/*
 * PlayListDatabase.
 *
 * Sirve como interfaz para la gestión de playlist con la base de datos.
 */
class PlaylistDatabase {
	
	private $database = null;
	
	/*
	 * Constructora con el conector con la base de datos.
	 * @param Database $db
	 */
	function __construct($db) {
		$this->database = $db;
	}

	/*
	 * Añade una nueva playlist a la tabla playlists de la base de datos creada
	 * por un usuario.
	 * @param Int $userId
	 * @param Playlist $playlist
	 * @return boolean false si se ha producido un error en la inserción, true en caso contrario.
	 */
	public function insertNewPlaylist($userId, &$playlist) {
		
		// Inserta la nueva playlist en la tabla
		$sql ="INSERT INTO `playlists` (`name`, `creatorId`, `positiveVotes`, `negativeVotes`)
			VALUES (
			'".mysql_real_escape_string($playlist->name)."',
			'".mysql_real_escape_string($userId)."',
			0,
			0
		)";
		$this->database->sql($sql);
		
		// Obtiene el id generado por la base de datos para la playlist
		$sql = "SELECT playlists.id FROM `playlists` 
			WHERE playlists.creatorId = '".mysql_real_escape_string($userId)."' and playlists.name = '".mysql_real_escape_string($playlist->name)."'
		";

		if ($row = mysql_fetch_array($this->database->sql($sql))) {
			$playlist->id = $row['id'];
		}
		$playlist->creatorId = $userId;
	}
	
	/*
	 * Añade una playlist a la lista de favoritas de un usuario.
	 * @param User $user
	 * @param Playlist $playlist
	 * @return boolean false si se ha producido un error en la inserción, true en caso contrario.
	 */
	public function addFavouritePlaylist($user, $playlist) {
		
		$ownersCount = -1;
		
		$sql ="INSERT INTO `favourites` (`userId`, `playlistId`)
			VALUES (
			'".mysql_real_escape_string($user->id)."',
			'".mysql_real_escape_string($playlist->id)."'
		)";
		$this->database->sql($sql);
	}
	
	/*
	 * Elimina la relación de playlist asociada a un usuario.
	 * @param int $userId
	 * @param int $playlistId
	 * @return boolean false si se ha producido un error en la eliminación, true en caso contrario.
	 */
	public function removePlaylist($userId, $playlistId) {
		$sql ="DELETE FROM `playlists`
		WHERE `id` = '".mysql_real_escape_string($playlistId)."'";
		$this->database->sql($sql);
		
		$sql ="DELETE FROM `votes_user_pl`
		WHERE `playlistId` = '".mysql_real_escape_string($playlistId)."'";
		$this->database->sql($sql);
		
		$sql ="DELETE FROM `favorites_user_pl`
		WHERE `playlistId` = '".mysql_real_escape_string($playlistId)."'";
		$this->database->sql($sql);
	}
	
	/*
	 * Obtiene una playlist de la tabla playlists mediante su identificador.
	 * @param integer $playlistId
	 * @return Playlist null si no se ha podido obtener.
	 */
	public function getPlaylistById($playlistId) {
	
		$pl = null;
	
		$sql = "SELECT playlists.id, playlists.name, playlists.creatorId, playlists.positiveVotes, playlists.negativeVotes  FROM `playlists` 
			WHERE playlists.id = '".mysql_real_escape_string($playlistId)."'
		";
	
		if ($row = mysql_fetch_array($this->database->sql($sql))) {
			$pl = new Playlist();
			$pl->id = $playlistId;
			$pl->name = $row['name'];
			$pl->creatorId = $row['creatorId'];
			$pl->positiveVotes = $row['positiveVotes'];
			$pl->negativeVotes = $row['negativeVotes'];
		}
		
		return $pl;
	}
	
	/*
	 * Obtiene todas las playlist creadas por un usuario.
	 * @param int $userId
	 * @return Playlist null si no se ha podido obtener.
	 */
	public function getAllPlaylistsFromUser($userId) {
		
		$i = 0;
		$retVal = null;
		
		$sql = "SELECT playlists.id, playlists.name, playlists.creatorId, playlists.positiveVotes, playlists.negativeVotes FROM `playlists`
			WHERE playlists.creatorId = '".mysql_real_escape_string($userId)."'
		";
		
		$result = $this->database->sql($sql);
		while ($row = mysql_fetch_array($result)) {
			$retVal[$i] = new Playlist();
			$retVal[$i]->id = $row['id'];
			$retVal[$i]->name = $row['name'];
			$retVal[$i]->creatorId = $row['creatorId'];
			$retVal[$i]->positiveVotes = $row['positiveVotes'];
			$retVal[$i]->negativeVotes = $row['negativeVotes'];
			$i++;
		}
		
		return $retVal;
	}
	
	/*
	 * Actualiza una playlist de un usuario si el usuario es el creador.
	 * @param User $user
	 * @param Playlist $playlist
	 * @return boolean true si se ha actualizado la playlist, false en caso contrario.
	 */
	public function updatePlaylist($user,$playlist) {
		
		if ( $user->id == $playlist->creatorId) {
			$sql ="UPDATE `playlists` SET `name`='".mysql_real_escape_string($playlist->name)."'
				WHERE `id` = '".mysql_real_escape_string($playlist->id)."'";
			return $this->database->sql($sql);
		}
		else return false;
		
	}
	
	/*
	 * Aumenta en uno el número de votos positivos.
	 * @param integer $playlistId
	 * @return integer El número de votos positivos resultante.
	 */
	public function increasePositiveVotes($playlistId) {
		$playlists = $this->getPlaylistById($playlistId);
		$newPositiveVotes = $playlists->positiveVotes + 1;
		$sql ="UPDATE `playlists` SET `positiveVotes`='".mysql_real_escape_string($newPositiveVotes)."'
				WHERE `id` = '".mysql_real_escape_string($playlistId)."'";
		$this->database->sql($sql);
		return $newPositiveVotes;
	}
	
	/*
	 * Disminuye en uno el número de votos positivos.
	 * @param integer $playlistId
	 * @return integer El número de votos positivos resultante.
	 */
	public function decreasePositiveVotes($playlistId) {
		$playlists = $this->getPlaylistById($playlistId);
		$newPositiveVotes = $playlists->positiveVotes - 1;
		if ($newPositiveVotes >= 0) {
			$sql ="UPDATE `playlists` SET `positiveVotes`='".mysql_real_escape_string($newPositiveVotes)."'
				WHERE `id` = '".mysql_real_escape_string($playlistId)."'";
			$this->database->sql($sql);
			return $newPositiveVotes;
		}
		return $playlists->positiveVotes;
	}
	
	/*
	 * Aumenta en uno el número de votos positivos.
	 * @param integer $playlistId
	 * @return integer El número de votos negativos resultante.
	 */
	public function increaseNegativeVotes($playlistId) {
		$playlists = $this->getPlaylistById($playlistId);
		$newNegativeVotes = $playlists->negativeVotes + 1;
		$sql ="UPDATE `playlists` SET `negativeVotes`='".mysql_real_escape_string($newNegativeVotes)."'
				WHERE `id` = '".mysql_real_escape_string($playlistId)."'";
		$this->database->sql($sql);
		return $newNegativeVotes;
	}
	
	/*
	 * Disminuye en uno el número de votos negativos.
	 * @param integer $playlistId
	 * @return integer El número de votos negativos resultante.
	 */
	public function decreaseNegativeVotes($playlistId) {
		$playlists = $this->getPlaylistById($playlistId);
		$newNegativeVotes = $playlists->negativeVotes - 1;
		if ($newNegativeVotes >= 0) {
			$sql ="UPDATE `playlists` SET `negativeVotes`='".mysql_real_escape_string($newNegativeVotes)."'
				WHERE `id` = '".mysql_real_escape_string($playlistId)."'";
			$this->database->sql($sql);
			return $newNegativeVotes;
		}
		return $playlists->negativeVotes;
	}
	
	/*
	 * Comprueba si un usuario puede votar a una playlist.
	 * @param integer $userId
	 * @param integer $playlistId
	 * @return boolean Cierto si el usuario no ha votado esa playlist antes.
	 */
	public function canVote($userId,$playlistId) {
		$row = null;
			
		// Chequea si existe una entrada (voto) con ese usuario y playlist
		$sql = "SELECT votes_user_pl.userId FROM `votes_user_pl` 
			WHERE votes_user_pl.userId = '".mysql_real_escape_string($userId)."' and votes_user_pl.playlistId = '".mysql_real_escape_string($playlistId)."'
		";
		if ($row = mysql_fetch_array($this->database->sql($sql))) {
			return false; // ya existe el voto
		}
		else return true;
	}
	
	/*
	 * Establece el voto de un usuario por una playlist.
	 * @param integer $userId
	 * @param integer $playlistId
	 * @return boolean Falso si se ha producido un error con la base de datos.
	 */
	public function insertVoteRelation($userId,$playlistId) {
		$sql ="INSERT INTO `votes_user_pl` (`userId`, `playlistId`)
			VALUES (
			'".mysql_real_escape_string($userId)."',
			'".mysql_real_escape_string($playlistId)."'
		)";
		return $this->database->sql($sql);
	}
	
	/*
	 * Añade una playlist a la lista de favoritas de un usuario
	 * @param integer $userId
	 * @param integer $playlistId
	 * @return boolean Falso si se ha producido un error con la base de datos.
	*/
	public function addFavorite($userId, $playlistId) {
		$sql ="INSERT INTO `favorites_user_pl` (`userId`, `playlistId`)
			VALUES (
			'".mysql_real_escape_string($userId)."',
			'".mysql_real_escape_string($playlistId)."'
		)";
		return $this->database->sql($sql);
	}
	
	/*
	 * Elimina la relación de playlist favorita de un usuario.
	 * @param int $userId
	 * @param int $playlistId
	 * @return boolean false si se ha producido un error en la eliminación, true en caso contrario.
	 */
	public function removeFavorite($userId, $playlistId) {
		$sql ="DELETE FROM `favorites_user_pl`
		WHERE `playlistId` = '".mysql_real_escape_string($playlistId)."'";
		
		return $this->database->sql($sql);
	}
	
	/*
	 * Comprueba si una playlist es favorita de un usuario
	 * @param integer $userId
	 * @param integer $playlistId
	 * @return boolean.
	*/
	public function isFavorite($userId, $playlistId) {
		$row = null;
		
		$sql ="SELECT userId FROM `favorites_user_pl` 
			WHERE userId = '".mysql_real_escape_string($userId)."' AND playlistId = '".mysql_real_escape_string($playlistId)."'
		";
		
		return ($row = mysql_fetch_array($this->database->sql($sql)));
	}
	
	/*
	 * Obtiene una lista de las playlist favoritas del usuario
	 * @param integer userId
	 * @return Playlist null si no se ha podido obtener.
	*/
	public function getMyFavorites($userId) {
		$i = 0;
		$retVal = null;
		
		$sql = "SELECT playlists.id, playlists.name, playlists.creatorId, playlists.positiveVotes, playlists.negativeVotes FROM `playlists`, `favorites_user_pl`
			WHERE playlists.id = favorites_user_pl.playlistId AND favorites_user_pl.userId = '".mysql_real_escape_string($userId)."'
		";
		
		$result = $this->database->sql($sql);
		while ($row = mysql_fetch_array($result)) {
			$retVal[$i] = new Playlist();
			$retVal[$i]->id = $row['id'];
			$retVal[$i]->name = $row['name'];
			$retVal[$i]->creatorId = $row['creatorId'];
			$retVal[$i]->positiveVotes = $row['positiveVotes'];
			$retVal[$i]->negativeVotes = $row['negativeVotes'];
			$i++;
		}
		
		return $retVal;
	}

}
?>